nethackfandomcom-20200214-history
Source:Hack 1.0/mklv.shk.c
Below is the full text to mklv.shk.c from the source code of Hack 1.0. To link to a particular line, write [[Hack 1.0/mklv.shk.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* Copyright © Stichting Mathematisch Centrum, Amsterdam, 1984. */ 2. 3. #ifndef QUEST 4. #include "mklev.h" 5. #include "def.eshk.h" 6. #define ESHK ((struct eshk *)(&(shk->mextra0))) 7. extern struct monst *makemon(); 8. 9. char shtypes[] = "=/)%?!/* 8 shoptypes: 7 specialised, 1 mixed */ 10. schar shprobs[ = { 3,3,5,5,10,10,14,50 }; /* their probabilities */ 11. 12. mkshop(){ 13. register struct mkroom *sroom; 14. register int sh,sx,sy,i; 15. register char let; 16. int roomno; 17. register struct monst *shk; 18. for(sroom = &rooms0, roomno = 0; ; sroom++, roomno++){ 19. if(sroom->hx < 0) return; 20. if(sroom->lx <= xdnstair && xdnstair <= sroom->hx && 21. sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue; 22. if(sroom->lx <= xupstair && xupstair <= sroom->hx && 23. sroom->ly <= yupstair && yupstair <= sroom->hy) continue; 24. if( 25. #ifdef WIZARD 26. wizard || 27. #endif WIZARD 28. sroom->doorct 1) break; 29. } 30. #ifdef WIZARD 31. if(wizard){ 32. extern char *getenv(); 33. register char *ep = getenv("SHOPTYPE"); 34. if(ep){ 35. if(*ep 'z' || *ep 'Z'){ 36. mkzoo(); 37. return; 38. } 39. for(i=0; shtypesi; i++) 40. if(*ep shtypesi) break; 41. let = i; 42. goto gotlet; 43. } 44. } 45. #endif WIZARD 46. for(i = rn2(100),let = 0; (i -= shprobslet)>= 0; let++) 47. if(!shtypeslet) break; /* superfluous */ 48. #ifdef WIZARD 49. gotlet: 50. #endif WIZARD 51. sroom->rtype = 8+let; 52. let = shtypeslet; 53. sh = sroom->fdoor; 54. sx = doorssh.x; 55. sy = doorssh.y; 56. if(sx sroom->lx-1) sx++; else 57. if(sx sroom->hx+1) sx--; else 58. if(sy sroom->ly-1) sy++; else 59. if(sy sroom->hy+1) sy--; else { 60. printf("Where is shopdoor?"); 61. return; 62. } 63. if(!(shk = makemon(PM_SHK,sx,sy))) return; 64. shk->isshk = shk->mpeaceful = 1; 65. shk->msleep = 0; 66. shk->mtrapseen = ~0; /* we know all the traps already */ 67. ESHK->shoproom = roomno; 68. ESHK->shd = doorssh; 69. ESHK->shk.x = sx; 70. ESHK->shk.y = sy; 71. ESHK->robbed = 0; 72. ESHK->visitct = 0; 73. shk->mgold = 1000 + 30*rnd(100); /* initial capital */ 74. ESHK->billct = 0; 75. findname(ESHK->shknam, let); 76. for(sx = sroom->lx; sx <= sroom->hx; sx++) 77. for(sy = sroom->ly; sy <= sroom->hy; sy++){ 78. register struct monst *mtmp; 79. if((sx sroom->lx && doorssh.x sx-1) || 80. (sx sroom->hx && doorssh.x sx+1) || 81. (sy sroom->ly && doorssh.y sy-1) || 82. (sy sroom->hy && doorssh.y sy+1)) continue; 83. if(rn2(100) < dlevel && !m_at(sx,sy) && 84. (mtmp = makemon(PM_MIMIC, sx, sy))){ 85. mtmp->mimic = 86. (let && rn2(10) < dlevel) ? let : ']'; 87. continue; 88. } 89. mkobj_at(let, sx, sy); 90. } 91. #ifdef WIZARD 92. if(wizard) printf("I made a %c-shop.", let ? let : 'g'); 93. #endif WIZARD 94. } 95. 96. mkzoo(){ 97. register struct mkroom *sroom; 98. register int sh,sx,sy,i; 99. int goldlim = 500 * dlevel; 100. for(sroom = &rooms0; ; sroom++){ 101. if(sroom->hx < 0) return; 102. if(sroom->lx <= xdnstair && xdnstair <= sroom->hx && 103. sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue; 104. if(sroom->lx <= xupstair && xupstair <= sroom->hx && 105. sroom->ly <= yupstair && yupstair <= sroom->hy) continue; 106. if(sroom->doorct 1) break; 107. } 108. sroom->rtype = 7; 109. sh = sroom->fdoor; 110. for(sx = sroom->lx; sx <= sroom->hx; sx++) 111. for(sy = sroom->ly; sy <= sroom->hy; sy++){ 112. if((sx sroom->lx && doorssh.x sx-1) || 113. (sx sroom->hx && doorssh.x sx+1) || 114. (sy sroom->ly && doorssh.y sy-1) || 115. (sy sroom->hy && doorssh.y sy+1)) continue; 116. (void) makemon((struct permonst *) 0,sx,sy); 117. i = sq(dist2(sx,sy,doorssh.x,doorssh.y)); 118. if(i >= goldlim) i = 5*dlevel; 119. goldlim -= i; 120. mkgold(10 + rn2(i), sx, sy); 121. } 122. #ifdef WIZARD 123. if(wizard) printf("I made a zoo."); 124. #endif WIZARD 125. } 126. 127. dist2(x0,y0,x1,y1){ 128. return((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1)); 129. } 130. 131. sq(a) int a; { 132. return(a*a); 133. } 134. #endif QUEST mklv.shk.c